package persistencia;

import bitclub.Trabajador;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author Bit Company
 */
public class PTrabajador {

    /**
     * Introduce un objeto Trabajador en la base de datos 
     */
    public static void nuevoBD(Trabajador trabajador) {
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");

        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = connection.createStatement();

            //Ciertos campos requieren tratamiento previo para pasarlo a String

            Date dateFechaAlta = trabajador.getFechaAlta();
            String stringFechaAlta = dateFormat.format(dateFechaAlta);

            Date dateFechaBaja = trabajador.getFechaBaja();
            String stringFechaBaja;
            if (dateFechaBaja == null) {
                stringFechaBaja = "null";
            } else {
                stringFechaBaja = "'" + dateFormat.format(dateFechaAlta) + "'";
            }

            Date dateNacimiento = trabajador.getNacimiento();
            String stringNacimiento;
            if (dateNacimiento == null) {
                stringNacimiento = "null";
            } else {
                stringNacimiento = "'" + dateFormat.format(dateNacimiento) + "'";
            }

            int administrador = trabajador.isAdministrador() ? 1 : 0;
            int activo = trabajador.isActivo() ? 1 : 0;

            // Pasamos la cadena del INSERT para la base de datos

            statement.executeUpdate("INSERT INTO TRABAJADORES (dni, password, nombre, apellidos,"
                    + "direccion, localidad, cp, f_nacimiento, email, tfno_f, tfno_m, sexo, fecha_alta,"
                    + "fecha_baja, activo, administrador) values ('" + trabajador.getDni() + "', '" + trabajador.getPassword()
                    + "', '" + trabajador.getNombre() + "', '" + trabajador.getApellidos() + "', '"
                    + trabajador.getDireccion() + "', '" + trabajador.getLocalidad() + "', '"
                    + trabajador.getCodigoPostal() + "', " + stringNacimiento + ", '" + trabajador.getMail()
                    + "', '" + trabajador.getTel_fijo() + "', '" + trabajador.getTel_movil() + "', '"
                    + trabajador.getSexo() + "', '" + stringFechaAlta + "', " + stringFechaBaja
                    + ", " + activo + ", " + administrador + ")");

            //Asignamos el ID con el que se guardó en la base de datos

            resultSet = statement.executeQuery("SELECT ID FROM TRABAJADORES ORDER BY ID DESC");
            if (resultSet.next()) {
                trabajador.setId(resultSet.getInt("id"));
            }

        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }
    }

    /**
     * Actualiza los datos de un objeto Trabajador en la base de datos 
     */
    public static void actualizarBD(Trabajador trabajador) {
        Connection connection = null;
        Statement statement = null;
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");

        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = connection.createStatement();

            //Ciertos campos requieren tratamiento previo para pasarlo a String

            Date dateFechaAlta = trabajador.getFechaAlta();
            String stringFechaAlta = dateFormat.format(dateFechaAlta);

            Date dateFechaBaja = trabajador.getFechaBaja();
            String stringFechaBaja = "";
            if (dateFechaBaja == null) {
                stringFechaBaja = "null";
            } else {
                stringFechaBaja = "'" + dateFormat.format(dateFechaAlta) + "'";
            }

            Date dateNacimiento = trabajador.getNacimiento();
            String stringNacimiento = "";
            if (dateNacimiento == null) {
                stringNacimiento = "null";
            } else {
                stringNacimiento = "'" + dateFormat.format(dateNacimiento) + "'";
            }

            int administrador = trabajador.isAdministrador() ? 1 : 0;
            int activo = trabajador.isActivo() ? 1 : 0;

            // Pasamos la cadena del INSERT para la base de datos
            
            statement.executeUpdate("UPDATE TRABAJADORES SET DNI = '" + trabajador.getDni() + "', PASSWORD = '" + trabajador.getPassword()
                    + "', NOMBRE = '" + trabajador.getNombre() + "', APELLIDOS = '" + trabajador.getApellidos() + "', DIRECCION = '" + trabajador.getDireccion()
                    + "', LOCALIDAD =  '" + trabajador.getLocalidad() + "', CP = '" + trabajador.getCodigoPostal() + "', F_NACIMIENTO = " + stringNacimiento
                    + ", EMAIL =  '" + trabajador.getMail() + "', TFNO_F = '" + trabajador.getTel_fijo() + "', TFNO_M =  '" + trabajador.getTel_movil()
                    + "', SEXO =  '" + trabajador.getSexo() + "', FECHA_ALTA =  '" + stringFechaAlta
                    + "', FECHA_BAJA = " + stringFechaBaja + ", ACTIVO = " + activo + ", ADMINISTRADOR = " + administrador
                    + " WHERE ID = " + trabajador.getId());

        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                statement.close();
                connection.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }

    }

    /**
     * Devuelve todos aquellos Trabajadores cuyo nombre coincide con el introducido por teclado en la base de datos 
     */
    public static List<Trabajador> seleccionarPorNombreBD(String nombre) {
        List<Trabajador> listTrabajador = new ArrayList();
        String sql="SELECT id, dni, password, nombre, apellidos, direccion, localidad, cp, f_nacimiento, email, tfno_f, tfno_m, sexo, fecha_alta, fecha_baja, activo, administrador FROM TRABAJADORES WHERE NOMBRE LIKE '%" + nombre + "%'";
        listTrabajador=seleccionarBD(sql);
        return listTrabajador;
    }

    /**
     * Devuelve un objeto Trabajador cuyo DNI coincide en la base de datos con el introducido por teclado.
     */
    public static Trabajador seleccionarPorDniBD(String dni) {
        List<Trabajador> listTrabajador = new ArrayList();
        String sql="SELECT id, dni, password, nombre, apellidos, direccion, localidad, cp, f_nacimiento, email, tfno_f, tfno_m, sexo, fecha_alta, fecha_baja, activo, administrador FROM TRABAJADORES WHERE DNI='" + dni + "'";
        listTrabajador=seleccionarBD(sql);
        if(listTrabajador.isEmpty()){
            return null;
        }else{
            return listTrabajador.get(0);
        }
    }

    /**
     * Devuelve el trabajador cuyo id se corresponda con el parametro
     * @param dni
     * @return Cliente
     */
    public static Trabajador seleccionarPorIdBD(int id) {
        List<Trabajador> listTrabajador = new ArrayList();
        String sql="SELECT id, dni, password, nombre, apellidos, direccion, localidad, cp, f_nacimiento, email, tfno_f, tfno_m, sexo, fecha_alta, fecha_baja, activo, administrador FROM TRABAJADORES WHERE ID=" + id;
        listTrabajador=seleccionarBD(sql);
        if(listTrabajador.isEmpty()){
            return null;
        }else{
            return listTrabajador.get(0);
        }
    }

    public static List<Trabajador> seleccionarBD(String sql) {
        //Lista de trabajadores que devolveremos
        List<Trabajador> listTrabajador = new ArrayList();

        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;

        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

        try {
            Trabajador trabajador = null;

            Class.forName("com.mysql.jdbc.Driver");
            connection = DriverManager.getConnection(PDatos.baseDatos, PDatos.usuario, PDatos.password);
            statement = connection.createStatement();
            resultSet = statement.executeQuery(sql);

            while (resultSet.next()) {

                trabajador = new Trabajador();

                trabajador.setId(resultSet.getInt("id"));
                trabajador.setDni(resultSet.getString("dni"));
                trabajador.setPassword(resultSet.getString("password"));
                trabajador.setNombre(resultSet.getString("nombre"));
                trabajador.setApellidos(resultSet.getString("apellidos"));
                trabajador.setDireccion(resultSet.getString("direccion"));
                trabajador.setLocalidad(resultSet.getString("localidad"));
                trabajador.setCodigoPostal(resultSet.getString("cp"));
                if (resultSet.getString("f_nacimiento") == null) {
                    trabajador.setNacimiento(null);
                } else {
                    trabajador.setNacimiento(dateFormat.parse(resultSet.getString("f_nacimiento")));
                }
                trabajador.setMail(resultSet.getString("email"));
                trabajador.setTel_fijo(resultSet.getString("tfno_f"));
                trabajador.setTel_movil(resultSet.getString("tfno_m"));
                trabajador.setSexo(resultSet.getString("sexo").charAt(0));
                trabajador.setFechaAlta(dateFormat.parse(resultSet.getString("fecha_alta")));
                if (resultSet.getString("fecha_baja") == null) {
                    trabajador.setFechaBaja(null);
                } else {
                    trabajador.setFechaBaja(dateFormat.parse(resultSet.getString("fecha_baja")));
                }

                //Los siguientes campos son boolean
                if (resultSet.getInt("activo") == 1) {
                    trabajador.setActivo(true);
                } else {
                    trabajador.setActivo(false);
                }

                if (resultSet.getInt("administrador") == 1) {
                    trabajador.setAdministrador(true);
                } else {
                    trabajador.setAdministrador(false);
                }

                //Trabajador construido y lo añadimos a la lista
                listTrabajador.add(trabajador);

            }

        } catch (Exception ex) {
            System.out.println(ex.toString());
        } finally {
            try {
                resultSet.close();
                statement.close();
                connection.close();
            } catch (Exception ex) {
                System.out.println(ex.toString());
            }
        }
        return listTrabajador;
    }

}